#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    int opt;
    char *filename = NULL;
    int verbose = 0;
    int count = 0;

    // 解析命令行选项
    // "f:vc:" 表示：
    //   -f 必须带参数 (如 -f file.txt)
    //   -v 不带参数
    //   -c 必须带参数 (如 -c 5)
    while ((opt = getopt(argc, argv, "f:vc:")) != -1) {
	printf("arg %c\n", opt);
        switch (opt) {
            case 'f':
                filename = optarg; // optarg 指向 -f 后面的参数
                break;
            case 'v':
                verbose = 1;
                break;
            case 'c':
                count = atoi(optarg); // 将字符串参数转换为整数
                break;
            case '?':
                // 当遇到未定义的选项或必须参数的选项缺少参数时，getopt 会返回 '?'
                fprintf(stderr, "Usage: %s [-f filename] [-v] [-c count] [other_args...]\n", argv[0]);
                exit(EXIT_FAILURE);
            default:
                fprintf(stderr, "Unexpected option: %c\n", opt);
                exit(EXIT_FAILURE);
        }
    }

    // 输出解析结果
    if (filename) {
        printf("Filename set to: %s\n", filename);
    } else {
        printf("Filename not set.\n");
    }
    printf("Verbose mode is %s.\n", verbose ? "ON" : "OFF");
    printf("Count is: %d\n", count);

    // 处理非选项参数（即那些不是以 '-' 开头的参数）
    if (optind < argc) {
        printf("Non-option arguments: ");
        for (int i = optind; i < argc; i++) {
            printf("%s ", argv[i]);
        }
        printf("\n");
    }

    return 0;
}

